perm filename CREMEM[CRE,BGB]1 blob
sn#104787 filedate 1974-06-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE CREMEM - MEMORY MANAGEMENT - BGB - 16 APRIL 1973.
C00005 00003 SUBR(MKNODE)TYPE. MAKE A NODE.
C00007 00004 SUBR(MORCOR). GET MORE CORE.
C00009 00005 SUBR(MKBANK)CNT
C00012 00006 SUBR(SHRINK). SHRINK NODE SPACE.
C00015 00007
C00018 00008 SUBR(RELDWN) RELOCATE DOWN.
C00021 00009 SUBR(RELUP)BNK RELOCATE LINKS UP.
C00023 ENDMK
C⊗;
TITLE CREMEM - MEMORY MANAGEMENT - BGB - 16 APRIL 1973.
.INSERT MNCRE
;CRE NODE SPACE IS COMPOSED OF 4K BANKS.
FILM↑:0
BLKCNT↑:0↔AVAIL↑:0
BREAK↑: 0 ;SHRINK BREAK ADDRESS.
BNKCNT↑:0 ;BANK COUNTER.
BANK↑: BLOCK =34 ;4K WORDS TO A BANK.
FNAME↑: ASCIZ/TMP/↔0 ;FILM NAME.
FNAME6↑:SIXBIT/TMP/
;CAREYE STANDARD TV FILE IS =10496 WORDS LONG, 24400 OCTAL.
;=10 WORD HEADER, =216 ROWS OF =288 COLUMNS OF 6 BITS PER PIXEL.
;=118 WORD TRAILER.
INTERN VSEG,HSEG,PAC,SKY,HI
HI ←← 400000
PAC ← HI ↔ HI ←← HI + =1728 ;PICTURE ACCUMULATOR.
VSEG← HI ↔ HI ←← HI + =1729 ;VERTICAL SEGMENTS.
HSEG← HI ↔ HI ←← HI + =1736 ;HORIZONTAL SEGMENTS.
SKY ← HI ↔ HI ←← HI + =31500 ;SKY ARRAY.
;--------------------------------------------------------------------
BLOCK =86 ;NEGATIVE ROWS.
HEADER↑: BLOCK =128
TVBUF↑: BLOCK =10368 ;TV BUFFER 6 BITS PER PIXEL.
;POINTERS TO TV BUFFER.
TV: 0
POINT 6,-1,29 ;COLUMN -2.
POINT 6,-1,35 ;COLUMN -1.
COLPTR↑:FOR I←0,=48{
I+<POINT 6,0,05>↔I+<POINT 6,0,11>↔I+<POINT 6,0,17>
I+<POINT 6,0,23>↔I+<POINT 6,0,29>↔I+<POINT 6,0,35>}
ROWPTR↑:FOR I←0,=216{
I*=48+TVBUF}
TVSEG: 0
;POINTERS TO SKY ARRAY.
INTERN PUTSKY,GETSKY
PUTSKY: FOR I←0,=108{DIP 0,SKY+=289*I(3)
}↔ FOR I←1,=108{DAP 0,SKY+=289*I(3)
}↔ GETSKY: FOR I←0,=108{CAR 1,SKY+=289*I(3)
}↔ FOR I←1,=108{CDR 1,SKY+=289*I(3)
}
QIMAGE↑:0↔BLOCK 8
QNODE↑:0↔BLOCK 8
HISTO↑: BLOCK =64 ;HISTOGRAM.
FTVSIX↑:0↔FTVHIS↑:0 ;FLAG TV SIX BIT & FLAG TV HISTOGRAM.
SUBR(MKNODE)TYPE. MAKE A NODE.
BEGIN MKNODE;-----------------------------------------------------
SKIPN 1,AVAIL↔CALL(MORCOR) ;NEXT AVAILABLE NODE.
CDR(1)↔DAP AVAIL ;UPDATE AVAIL LSIT.
DZM(1)↔AOS BLKCNT ;CLEAR LINK & COUNT NODES.
POP P,0↔POP P,2(1)↔GO @0 ;POP-PC & POP-TYPE & RETURN.
BEND MKNODE; BGB 10 JANUARY 1973 ---------------------------------
SUBR(KLNODE)NODE. KILL A NODE.
BEGIN KLNODE;-----------------------------------------------------
LAC 1,ARG1↔SOS BLKCNT
DZM(1)↔HRLI(1)↔HRRI 1(1)↔BLT NODSIZ-1(1)
LAC AVAIL↔HRRZM(1)↔HRRZM 1,AVAIL
POP1J
BEND KLNODE; BGB 17 DECEMBER 1972 --------------------------------
SUBR(RINGIN)PART,WHOLE. ATTACH A NODE IN A RING.
BEGIN RINGIN;-----------------------------------------------------
LAC 1,ARG2↔LAC 3,ARG1
DAD. 3,1↔SON 2,3
JUMPE 2,[SON. 1,3
DIP 1,(1)↔DAP 1,(1)↔POP2J]
CAR 3,(2)
DIP 3,(1)↔DAP 1,(3)
DAP 2,(1)↔DIP 1,(2)
POP2J↔LIT
BEND RINGIN; BGB 6 DECEMBER 1972 ---------------------------------
SUBR(MORCOR). GET MORE CORE.
BEGIN MORCOR;-----------------------------------------------------
ACCUMULATORS{PTR,SIZ}
;MAKE NEW NODES.
PUSH P,PTR↔PUSH P,SIZ ;SAVE ACCUMULATORS.
CALL(MKBANK,[1]) ;MAKE 1 NEW BANK.
CALL(MKALST) ;MAKE AVAIL LIST.
;MAKE FILM NODE.
SKIPN FILM↔GO[
SETQ(FILM,{MKNODE,[FBIT+FILREL]}) ;MAKE FILM NODE.
CCW. 1,1↔CW. 1,1↔GO .+1] ;FILM RING.
;RETURN NODE.
LAC 1,AVAIL ;RETURN AN EMPTY NODE.
POP P,SIZ↔POP P,PTR ;RESTORE AC'S.
POP0J
;.................................................
;PLACE 512 NEW NODES ONTO THE AVAIL LIST.
MKALST: LAC 1,PTR↔DIP 1,1
ADD 1,[XWD NODSIZ,0] ;<NEXT NODE>,,<THIS NODE>.
MOVEI 0,=511 ;NUMBER OF NEW NODES.
HLRZM 1,(1) ;PLACE A POINTER.
ADD 1,[XWD NODSIZ,NODSIZ] ;ADVANCE POINTERS.
SOJG 0,.-2
EXCH PTR,AVAIL↔DAP PTR,(1)↔POP0J ;NEW AVAIL & LAST NODE.
BEND MORCOR; BGB 30 MAY 1974 --------------------------------------------------
SUBR(MKBANK)CNT
BEGIN MKBANK;------------------------------------------------------------------
ACCUMULATORS{PTR,SIZ}
IFN SAIL{SEGNAM↔CAME[SIXBIT/*CRE*/]↔GO SAI2 ;CHECK FOR *CRE* SEGMENT.
DETSEG↔SKIPN 1,SAISEG↑↔GO L1 ;SAISEG=0 ASSUMES LOW SEG SAIL.
ATTSEG 1,↔FATAL(LOST SAISEG)} ;GET SAISEG.
IFE SAIL{
LAC SIZ,ARG1↔ASH SIZ,=12 ;SIZE ← CNT * =4096 WORDS.
LAC PTR,JOBREL↑↔LAC PTR↔ADD SIZ ;TOP OF MEMORY PLUS SIZE.
CORE↔GO[FATAL(NO MORE CORE.)]↔AOSA PTR} ;CORE FROM SYSTEM (IN ONE BLOCK).
L1: IFE SAIL{ADDI PTR,=4096} ;NEXT BANK.
IFN SAIL{MOVEI SIZ,=4096↔CALL(CORGET↑) ;CORE FROM SAIL (BLOCK PER BANK).
GO[FATAL(NO MORE CORE.)]}
CALL(SUB1)↔SOSLE ARG1↔GO L1 ;BANKS ARE 4K EACH.
IFN SAIL{SKIPN 1,CRESEG↑↔POP1J ;CHECK FOR *CRE* SEGMENT.
DETSEG↔ATTSEG 1,↔FATAL(LOST CRESEG)} ;REATTACH *CRE* SEGMENT.
POP1J
;...............................................;CLEAR BANK & SAVE ITS POINTER.
SUB1: HRLI(PTR)↔HRRI 1(PTR) ;SETUP BLIT POINTER.
DZM(PTR)↔BLT 0,=4095(PTR) ;CLEAR THE NEW BANK.
AOS 1,BNKCNT↑↔SOJGE 1,.+3 ;KEEP BANK TABLE SORTED.
CAMG PTR,BANK(1)↔GO[ ;TEST PTR GREATER THAN PREVIOUS.
LAC BANK(1)↔DAC BANK+1(1)↔GO .-2] ;BUBBLE THE PTR'S SPACE DOWN.
DAC PTR,BANK+1(1)↔POPJ P, ;INSERT PTR INTO BANK TABLE.
BEND MKBANK; BGB 30 MAY 1974 --------------------------------------------------
SUBR(SHRINK). SHRINK NODE SPACE.
BEGIN SHRINK;------------------------------------------------------------------
ACCUMULATORS{I,J,K,HOLE,BRK,NODE,L,R,S12,ECNT,WRDCNT}
;AMOUNT OF POTENTIALLY FREE SPACE.
LAC BNKCNT↔ASH 0,9 ;TOTAL NUMBER OF NODES.
SUB BLKCNT↔DAC 1 ;TOTAL NUMBER OF EMPTY NODES.
ASH -=9↔DAC EBANKS# ;NUMBER OF EMPTY BANKS.
ASH =9↔SUB 1,0↔DAC 1,ECNT ;NEW NUMBER OF EMPTY NODES.
ASH 1,=3↔DAC 1,WRDCNT ;NUMBER OF EMPTY WORDS.
;COMPUTE BRK ADDRESS.
L3: LAC 1,BNKCNT↔SUB 1,EBANKS↔DAC 1,BNKCNT ;NUMBER OF BANKS REMAINING.
LAC BRK,BANK(1)↔ADDI BRK,=4096 ;TOP OF LAST BANK.
SUB BRK,WRDCNT↔DAC BRK,BREAK ;LESS THE EMPTY SPACE.
;PURGE THE AVAIL LIST OF DEAD EMPTY NODES.
MOVEI J,AVAIL ;PRE-FIRST EMPTY NODE.
LAC I,J↔SKIPN J,(I)↔GO .+6 ;ADVANCE DOWN THE LIST.
CAMGE J,BRK↔GO .-4 ;IF LOC(EMPTY) ≥ BRK THEN
LAC J,(J)↔DAP J,(I) ;REMOVE NODE FROM LIST.
JUMPN J,.-4 ;CONTINUE.
;FOR EACH DEAD BANK - MOVE THE HIGH NODES INTO LOWER POSITIONS.
MOVN I,EBANKS↔SOS I ;AOBJN POINTER TO THE DEAD BANKS.
MOVSS I↔HRR I,BNKCNT
LAC J,ECNT↔LAC NODE,BRK↔GO LL2 ;PARTIALLY EMPTY BANK PARAMETERS.
LL1: LAC NODE,BANK(I)↔MOVEI J,=512 ;COMPLETLY EMPTY BANK PARAMETERS.
LL2: SKIPN 2(NODE)↔GO LL3 ;IGNORE EMPTY NODES.
LAC HOLE,AVAIL↔CDR(HOLE)↔DAC AVAIL ;GET AN EMPTY NODE BELOW BRK.
DIP NODE,0↔DAP HOLE,0 ;MOVE THE NODE'S CONTENTS DOWN.
BLT 0,NODSIZ-1(HOLE)
HRRZM HOLE,0(NODE) ;LEAVE NODE'S NEW ADDRESS AT OLD.
LL3: ADDI NODE,NODSIZ↔SOJG J,LL2 ;ADVANCE TO NEXT NODE.
AOBJN I,LL1 ;ADVANCE TO NEXT BANK.
;FOR EACH LIVE BANK - REPLACE LINKS WITH THEIR NEW VALUES.
MOVN I,BNKCNT↔HRLZS I↔AOS I ;FIRST BANK & NUMBER OF BANKS.
L.1: LAC NODE,BANK(I)↔MOVEI J,=512 ;FIRST NODE & NODES PER BANK.
L.2: HRLZ L,2(NODE) ;LEFT RELOC BITS OF NODE.
HRLZ R,2(NODE)↔LSH R,9 ;RIGHT RELOC BITS OF NODE.
HRLI NODE,-NODSIZ ;FOREACH WORD OF THE NODE.
L.3: JUMPL L,[CAR 1,(NODE)↔CAML 1,BRK
LAC 1,(1)↔DIP 1,(NODE)↔GO .+1] ;UPDATE LINK DOWN.
JUMPL R,[CDR 1,(NODE)↔CAML 1,BRK
LAC 1,(1)↔DAP 1,(NODE)↔GO .+1] ;UPDATE LINK DOWN.
ROTC L,1↔AOBJN NODE,L.3 ;ADVANCE A WORD.
CAML NODE,BRK↔GO .+3 ;TEST FOR FINAL EXIT.
SOJG J,L.2 ;ADVANCE A NODE.
AOBJN I,L.1 ;ADVANCE A BANK.
LAC 1,QIMAGE↑↔CAML 1,BRK ;REFRESH IMAGE.
LAC 1,(1)↔DAC 1,QIMAGE
;PLACE THE EMPTY SPACE OF LAST BANK INTO AVAIL LIST.
JUMPE ECNT,L4 ;EXACT SHRINK - EMPTY AVAIL LIST.
SETZM(BRK)↔DIP BRK,BRK ;LOWEST EMPTY NODE.
ADDI WRDCNT,-1(BRK) ;TOP OF PARTIALLY FILLED BANK.
LAC BRK↔AOS↔BLT(WRDCNT) ;CLEAR THE EMPTY SPACE.
ADDI BRK,NODSIZ↔GO .+3 ;XWD PREVIOUS,,CURRENT NODE.
HLRZM BRK,(BRK) ;CURRENT POINTS AT PREVIOUS.
ADD BRK,[XWD NODSIZ,NODSIZ] ;ADVANCE A NODE.
SOJG ECNT,.-2
L4: HLRZM BRK,AVAIL ;AVAIL POINTS AT LAST (OR ZERO).
;RETURN DEAD BANKS TO THE SYSTEM OR TO SAIL.
IFE SAIL{LAC 1,BNKCNT↔LAC BANK(1)
ADDI =4095↔CORE↔HALT↔POP0J ;SHRINK SYSTEM CORE.}
IFN SAIL{SKIPN K,EBANKS↔POP0J ;RETURN HIGH BANKS TO SAIL.
MOVNS K↔MOVSS K↔HRR K,BNKCNT↔AOS K
LAC 2,BANK(K)↔CALL(CORREL↑)↔AOBJN K,.-2↔POP0J}
LIT
BEND SHRINK;BGB 26 MAY 1974----------------------------------------------------
SUBR(RELDWN) ;RELOCATE DOWN.
BEGIN RELDWN;------------------------------------------------------------------
ACCUMULATORS{I,J,K,L,R,NODE,BP}
LAC BP,[POINT 5,1,=23] ;HIGH ORDER ADDRESS BITS.
LAC[XWD BADR,BADR+1] ;CLEAR THE BANK ADDRESS TABLE.
SETZM BADR↔BLT BADR+=65
;SETUP THE BANK ADDRESS TABLE.
SETZ↔MOVN I,BNKCNT↔HRLZS I↔AOS I ;FIRST BANK & NUMBER OF BANKS.
L0: LAC 1,BANK(I)↔LDB K,BP↔DAC 1,BADR(K) ;BANK POINTER INTO TABLE AT K.
DAC 0,BADR+=32(K)↔ADDI =4096 ;BANK'S DISPLACEMENT IN FILE.
AOBJN I,L0↔HLLOS BADR+1(K) ;MARK END OF TABLE WITH 777777
;FOREACH BANK - RELOCATE ALL THE LINKS DOWNWARDS.
MOVN I,BNKCNT↔HRLZS I↔AOS I ;FIRST BANK & NUMBER OF BANKS.
L1: LAC NODE,BANK(I)↔MOVEI J,=512 ;FIRST NODE & NODES PER BANK.
L2: HRLZ L,2(NODE) ;LEFT RELOC BITS OF NODE.
HRLZ R,2(NODE)↔LSH R,9 ;RIGHT RELOC BITS OF NODE.
HRLI NODE,-NODSIZ ;FOREACH WORD OF THE NODE.
L3: JUMPL L,[CAR 1,(NODE)↔JUMPE 1,.+1 ;FETCH NON-ZERO LINK.
LDB K,BP↔CAMGE 1,BADR(K)↔SOS K ;FIND LINK'S BASE ADDRESS.
SUB 1,BADR(K)↔ADD 1,BADR+=32(K)
DIP 1,(NODE)↔GO .+1] ;UPDATE LINK DOWN.
JUMPL R,[CDR 1,(NODE)↔JUMPE 1,.+1 ;FETCH NON-ZERO LINK.
LDB K,BP↔CAMGE 1,BADR(K)↔SOS K ;FIND LINK'S BASE ADDRESS.
SUB 1,BADR(K)↔ADD 1,BADR+=32(K)
DAP 1,(NODE)↔GO .+1] ;UPDATE LINK DOWN.
ROTC L,1↔AOBJN NODE,L3 ;ADVANCE A WORD.
CAML NODE,BREAK↔POP0J ;TEST FOR FINAL EXIT.
SOJG J,L2 ;ADVANCE A NODE.
AOBJN I,L1↔POP0J ;ADVANCE A BANK OR EXIT.
BADR: BLOCK =66 ;BANK ADDRESS TABLE ORDER BY HIGH ORDER BITS.
LIT
BEND RELDWN; BGB 27 MAY 1974 --------------------------------------------------
SUBR(RELUP)BNK ;RELOCATE LINKS UP.
BEGIN RELUP;-------------------------------------------------------------------
ACCUMULATORS{I,J,K,L,R,NODE,BP} ;COUNTERS I,J,K;REL-BITS;PTR'S.
LAC BP,[POINT 5,1,=23] ;HIGH ORDER ADDRESS BITS.
MOVN I,BNKCNT↔HRLZS I↔HRR I,ARG1 ;FIRST BANK & NUMBER OF BANKS.
L1: LAC NODE,BANK(I)↔MOVEI J,=512 ;FIRST NODE & NODES PER BANK.
L2: HRLZ L,2(NODE) ;LEFT RELOC BITS OF NODE.
HRLZ R,2(NODE)↔LSH R,9 ;RIGHT RELOC BITS OF NODE.
HRLI NODE,-NODSIZ ;FOREACH WORD OF THE NODE.
L3: JUMPL L,[CAR 1,(NODE)↔JUMPE 1,.+1 ;FETCH NON-ZERO LINK.
LDB K,BP↔ADD K,ARG1↔ANDI 1,7777 ;FIND THE LINKS BASE ADDRESS.
ADD 1,BANK(K)↔DIP 1,(NODE)↔GO .+1] ;UPDATE LINK UP.
JUMPL R,[CDR 1,(NODE)↔JUMPE 1,.+1 ;FETCH NON-ZERO LINK.
LDB K,BP↔ADD K,ARG1↔ANDI 1,7777 ;FIND LINK'S BASE ADDRESS.
ADD 1,BANK(K)↔DAP 1,(NODE)↔GO .+1] ;UPDATE LINK UP.
ROTC L,1↔AOBJN NODE,L3 ;ADVANCE A WORD.
CAML NODE,BREAK↔POP1J ;TEST FOR FINAL EXIT.
SOJG J,L2 ;ADVANCE A NODE.
AOBJN I,L1↔POP1J ;ADVANCE A BANK OR EXIT.
BEND RELUP; BGB 27 MAY 1974 ---------------------------------------------------
END